home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 051-060 / amok51 / detachfile / detachit.asm < prev    next >
Assembly Source File  |  1993-11-04  |  6KB  |  225 lines

  1. ;------------------------------------------------------------------------------
  2. ;
  3. ;   Detach
  4. ;
  5. ;------------------------------------------------------------------------------
  6.  
  7.  
  8. sysbase        equ     4
  9. FindName   equ   -276
  10. WaitPort   equ   -384
  11. DupLock    equ    -96
  12. Delay      equ   -198
  13. UnLock     equ    -90
  14. UnLoadSeg  equ   -156
  15. Open       equ    -30
  16. Close      equ    -36
  17.  
  18. Forbid     equ   -132
  19. CreateProc equ   -138
  20. Permit     equ   -138
  21. GetMsg     equ   -372
  22. ReplyMsg   equ   -378
  23. OpenLibrary  equ  -552
  24. CloseLibrary equ  -414
  25.  
  26.  
  27. Me         EQUR A4
  28. thisTask   EQU 276
  29. cli        EQU 172
  30. cis        EQU 156
  31. cos        EQU 160
  32.  
  33.             section "Startup",code
  34.  
  35. start
  36.             move.l  $4,A6
  37.             move.l  276(A6),Me    ; Exec.thisTask
  38.             tst.l   cli(Me)       ; pr_CLI
  39.             bne.s   fromdos
  40.             jmp     mainwb
  41.  
  42. fromdos:
  43.             move.l  D0,arglen;
  44.             lea     args,A1;
  45.             and.w   #$FF,D0
  46. doubargs:   move.b  (A0)+,(A1)+
  47.             dbra    D0,doubargs
  48.  
  49.             lea     dosname(PC),a1
  50.             move.l  #33,D0
  51.             jsr     OpenLibrary(A6)
  52.             move.l  d0,dosbase;
  53.  
  54.  
  55.             lea     start-4(PC),A1;start = effektiver Prg-Anf.
  56.             move.l  (A1),mySeg
  57.             move.l  (A1),CLI+60
  58.             clr.l   (a1)
  59.  
  60.             move.l  4,a0
  61.             move.l  276(a0),a0     ;ThisTask
  62.             move.l  152(a0),d1     ;pr_currentDir
  63.             move.l  dosbase,A6;
  64.             jsr     DupLock(A6);
  65.             move.l  d0,curDir
  66.             bne.s   \lockok
  67.             moveq   #20,d0;
  68.             rts;
  69.  
  70. \lockok:
  71.  
  72.             move.l  $4,A6;
  73.             jsr     Forbid(A6);
  74.             move.l  #newname,d1      ;newname
  75.             clr.l   d2               ;
  76.             move.b  9(Me),d2         ;Me.task.node.pri
  77.             move.l  #mainprg,d3      ;woher?
  78.             subq    #4,d3
  79.             lsr.l   #2,d3            ;BPTR *seglist
  80.             move.l  132(Me),d4       ;Me.stackSize
  81.             move.l  dosbase,A6;
  82.             jsr     CreateProc(A6)
  83.             sub.l   #92,D0
  84.             move.l  d0,a0
  85.             move.l  curDir,152(a0)
  86.             lea.l   CLI,a1;
  87.             move.l  a1,d0
  88.             lsr.l   #2,d0;
  89.             move.l  d0,cli(A0);
  90.             subq.l  #1,d0;
  91.             move.l  d0,4(a1);
  92.             move.l  d0,16(a1);
  93.             move.l  d0,24(a1);
  94.             move.l  d0,36(a1);
  95.             move.l  $4,A6;
  96.             jsr     Permit(A6);
  97.  
  98.             moveq   #0,d0
  99.             rts
  100.  
  101. dosname     dc.b    'dos.library',0
  102.  
  103.             EVEN
  104.  
  105.             section "Main",code
  106.  
  107. mainprg:
  108.             move.l  dosbase,A6;
  109.             move.l  #nilname,D1;
  110.             move.l  #1005,D2;
  111.             jsr     Open(A6);
  112.             move.l  d0,in
  113.             beq.s   quit;
  114.             move.l  #nilname,D1;
  115.             move.l  #1006,D2;
  116.             jsr     Open(A6);
  117.             move.l  d0,out;
  118.             beq.s   quit
  119.             move.l  $4,Me;
  120.             move.l  thisTask(Me),Me;
  121.             move.l  in,cis(Me);
  122.             move.l  out,cos(Me)
  123.             lea.l   CLI,A1;
  124.             move.l  curDir,8(A1)
  125.             move.l  in,28(A1);
  126.             move.l  in,32(A1);
  127.             move.l  out,48(A1);
  128.             move.l  out,56(A1);
  129.             move.l  arglen,D0;
  130.             lea.l   args,A0;
  131.  
  132. mainwb:     jsr     Program
  133.             move.l  8+CLI,curDir
  134.  
  135. quit:       move.l  D0,D3
  136.             move.l  curDir,D1;
  137.             beq.s   \nolock
  138.             move.l  dosbase,A6;
  139.             jsr     UnLock(A6);
  140.             move.l  $4,A6;
  141.             jsr     Forbid(A6);
  142.             move.l  dosbase,A6;
  143.             move.l  mySeg,D1;
  144.             jsr     UnLoadSeg(A6);
  145.             move.l  in,D1
  146.             beq.s   \a
  147.             jsr     Close(A6)
  148. \a:         move.l  out,D1
  149.             beq.s   \b
  150.             jsr     Close(A6)
  151. \b:         move.l  A6,A1
  152.             move.l  $4,A6;
  153.             jsr     CloseLibrary(A6);
  154. \nolock:    move.l  D3,D0
  155.             rts
  156.  
  157. newname     dc.b    'Detached',0
  158.             even
  159. nilname     dc.b    'NIL:',0
  160.  
  161.             section "DetachVars",bss
  162.  
  163. dosbase     dc.l    0
  164. curDir      dc.l    0
  165. mySeg       dc.l    0
  166. in          dc.l    0
  167. out         dc.l    0
  168. args        ds.b    256
  169. arglen      dc.l    0
  170. dummystr    dc.b    1,'?',0,0
  171. CLI         ds.l    16;
  172.  
  173.  
  174. ;------------------------------------------------------------------------------
  175. ;
  176. ;  Hier beginnt unabhängiges Programm:
  177. ;
  178. ;------------------------------------------------------------------------------
  179.  
  180.  
  181.             section "Program",code
  182.  
  183. Program:    move    D0,D3
  184.             move.l  $4,A6
  185.             move.l  thisTask(A6),Me
  186.             tst.l   cli(Me);
  187.             bne.s   \scli
  188.             lea.l   $5c(Me),A0;
  189.             jsr     WaitPort(A6);
  190.             lea.l   $5c(Me),A0;
  191.             jsr     GetMsg(A6);
  192.             move.l  D0,wbmsg;
  193. \scli:
  194.             lea     doslib(PC),a1
  195.             move.l  #33,D0
  196.             jsr     OpenLibrary(A6)
  197.             move.l  d0,dos;
  198.             beq.s   nodos;
  199.  
  200.             cmp     #1,D3;
  201.             bhi.s   loop
  202.             move    #100,D3
  203. loop:       bchg.b  #1,$bfe001;
  204.             moveq   #1,D1
  205.             move.l  dos,A6;
  206.             jsr     Delay(A6);
  207.             dbf     D3,loop
  208.             move.l  $4,A6;
  209.             move.l  dos,A1;
  210.             jsr     CloseLibrary(A6);
  211. nodos:      tst.l   cli(Me);
  212.             bne.s   \scli
  213.             jsr     Forbid(A6);
  214.             move.l  wbmsg(PC),A1;
  215.             jsr     ReplyMsg(A6);
  216. \scli:      moveq   #0,D0;
  217.             rts
  218.  
  219. wbmsg:      dc.l    0;
  220. dos:        dc.l    0;
  221. doslib:     dc.b    "dos.library",0
  222.  
  223.             end
  224.  
  225.